<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>C语言基础 - 条件语句</title>
    <link rel="stylesheet" href="common.css">
    <style>
        /* 页面特有样式 */
        .conditional-card {
            background-color: #f5f9ff;
            border-radius: 8px;
            padding: 15px;
            margin-bottom: 25px;
            border-left: 4px solid #4a90e2;
        }
        
        .flow-diagram {
            background-color: #f8f8f8;
            padding: 20px;
            border-radius: 5px;
            text-align: center;
            margin: 15px 0;
            font-family: monospace;
        }
        
        .comparison-box {
            background-color: #fff3e0;
            padding: 15px;
            border-radius: 5px;
            margin: 15px 0;
        }
        
        .best-practice {
            background-color: #e8f5e9;
            padding: 12px;
            border-left: 4px solid #2e7d32;
            margin: 15px 0;
        }
        
        .warning-note {
            background-color: #ffebee;
            border-left: 4px solid #f44336;
            padding: 12px;
            margin: 15px 0;
        }
    </style>
</head>
<body>
    <div class="container">
        <header>
            <h1>C语言基础入门课程</h1>
        </header>
        
        <nav>
            <a href="index.html">首页</a>
            <a href="02-intro.html">C语言简介与环境搭建</a>
            <a href="03-structure.html" class="current">C程序结构</a>
            <a href="04-datatypes.html">基本数据类型</a>
            <a href="05-variables.html">变量与常量</a>
            <a href="06-operators.html">运算符</a>
            <a href="07-io.html" class="current">输入输出</a>
            <a href="08-conditionals.html">条件语句</a>
            <a href="09-loops.html">循环结构</a>
            <a href="10-functions.html" class="current">函数基础</a>
            <a href="11-scope.html">作用域与存储类</a>
            <a href="12-recursion.html">递归函数</a>
            <a href="13-arrays.html">一维数组</a>
            <a href="14-multidim.html" class="current">多维数组</a>
            <a href="15-strings.html">字符串处理</a>
            <a href="16-pointers.html">指针基础</a>
            <a href="17-pointers_advanced.html" class="current">指针进阶</a>
            <a href="18-structs.html">结构体</a>
            <a href="19-files.html">文件操作</a>
            <a href="20-project.html">综合项目</a>
        </nav>
        
        <main>
            <h2>C语言条件语句</h2>
            
            <section>
                <h3>条件语句概述</h3>
                <p>条件语句允许程序根据不同的条件执行不同的代码块，实现分支逻辑。</p>
            </section>
            
            <div class="conditional-card">
                <h3>1. if/else结构</h3>
                
                <h4>基本语法</h4>
                <pre><code>if (条件表达式) {
    // 条件为真时执行的代码
} else {
    // 条件为假时执行的代码
}</code></pre>
                
                <div class="flow-diagram">
                    <h4>if/else流程图</h4>
                    <pre>
      +-----------+
      | 条件判断  |
      +-----+-----+
            |
   true +---+---+ false
        |       |
+-------+---+ +---+-------+
| if代码块 | | else代码块 |
+-----------+ +-----------+
                    </pre>
                </div>
                
                <h4>多条件示例</h4>
                <pre><code>if (score >= 90) {
    printf("优秀");
} else if (score >= 80) {
    printf("良好");
} else if (score >= 60) {
    printf("及格");
} else {
    printf("不及格");
}</code></pre>
                
                <div class="best-practice">
                    <h4>最佳实践</h4>
                    <ul>
                        <li>使用大括号{}明确代码块范围，即使只有一行代码</li>
                        <li>将最可能为真的条件放在前面提高效率</li>
                        <li>避免过深的嵌套层次(一般不超过3层)</li>
                    </ul>
                </div>
            </div>
            
            <div class="conditional-card">
                <h3>2. switch-case语句</h3>
                
                <h4>基本语法</h4>
                <pre><code>switch (表达式) {
    case 常量1:
        // 代码块1
        break;
    case 常量2:
        // 代码块2
        break;
    default:
        // 默认代码块
}</code></pre>
                
                <div class="flow-diagram">
                    <h4>switch-case流程图</h4>
                    <pre>
      +-----------+
      | 表达式求值 |
      +-----+-----+
            |
+-----------+-----------+
| case1 | case2 | default|
+-------+-------+-------+
    |       |       |
代码块1  代码块2  默认代码块
                    </pre>
                </div>
                
                <h4>实际示例</h4>
                <pre><code>char grade = 'B';
switch (grade) {
    case 'A':
        printf("优秀");
        break;
    case 'B':
        printf("良好");
        break;
    case 'C':
        printf("及格");
        break;
    default:
        printf("无效等级");
}</code></pre>
                
                <div class="warning-note">
                    <h4>重要注意事项</h4>
                    <ul>
                        <li>case后面必须是常量表达式</li>
                        <li>每个case块通常以break结束，否则会继续执行下一个case</li>
                        <li>default分支是可选的，但建议总是包含</li>
                        <li>switch表达式只能是整型或枚举类型</li>
                    </ul>
                </div>
                
                <div class="comparison-box">
                    <h4>if vs switch 比较</h4>
                    <table>
                        <tr>
                            <th>比较项</th>
                            <th>if语句</th>
                            <th>switch语句</th>
                        </tr>
                        <tr>
                            <td>适用条件</td>
                            <td>范围判断、复杂条件</td>
                            <td>离散值匹配</td>
                        </tr>
                        <tr>
                            <td>可读性</td>
                            <td>条件复杂时较差</td>
                            <td>多分支时更清晰</td>
                        </tr>
                        <tr>
                            <td>效率</td>
                            <td>顺序判断</td>
                            <td>可能使用跳转表</td>
                        </tr>
                    </table>
                </div>
            </div>
            
            <div class="conditional-card">
                <h3>3. 三元运算符</h3>
                
                <h4>基本语法</h4>
                <pre><code>条件表达式 ? 表达式1 : 表达式2</code></pre>
                <p>如果条件为真，返回表达式1的值，否则返回表达式2的值。</p>
                
                <h4>使用示例</h4>
                <pre><code>// 找出两个数中的较大值
int max = (a > b) ? a : b;

// 根据条件赋值
int abs_value = (num >= 0) ? num : -num;

// 简单条件输出
printf("该数字是%s\n", (num % 2 == 0) ? "偶数" : "奇数");</code></pre>
                
                <div class="best-practice">
                    <h4>使用建议</h4>
                    <ul>
                        <li>适合简单的条件赋值或返回</li>
                        <li>避免嵌套使用，降低可读性</li>
                        <li>表达式1和2的类型应该兼容</li>
                        <li>优先考虑可读性，复杂逻辑还是使用if语句</li>
                    </ul>
                </div>
                
                <div class="warning-note">
                    <h4>注意事项</h4>
                    <ul>
                        <li>三元运算符有返回值，可以用于赋值</li>
                        <li>表达式1和2都会被求值，不能替代if的短路特性</li>
                        <li>过度使用会降低代码可读性</li>
                    </ul>
                </div>
            </div>
            
            <section>
                <h3>综合应用示例</h3>
                <pre><code>#include &lt;stdio.h&gt;

int main() {
    int score;
    printf("请输入考试成绩(0-100): ");
    scanf("%d", &score);
    
    // 使用if验证输入范围
    if (score < 0 || score > 100) {
        printf("输入无效！\n");
        return 1;
    }
    
    // 使用switch判断等级
    char grade;
    switch (score / 10) {
        case 10:
        case 9: grade = 'A'; break;
        case 8: grade = 'B'; break;
        case 7: grade = 'C'; break;
        case 6: grade = 'D'; break;
        default: grade = 'F';
    }
    
    // 使用三元运算符决定评语
    const char *comment = (grade == 'A' || grade == 'B') 
        ? "表现优秀！" 
        : "需要继续努力";
    
    printf("等级: %c\n评语: %s\n", grade, comment);
    
    return 0;
}</code></pre>
            </section>
        </main>
        

</body>
</html>